/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import dao.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import modelo.Lei;

/**
 * DAO que acessa registro da tabela Lei.
 * 
 * @author emersonmx
 * @since 0.1
 */
public class DAOCadastroLei implements DAO {

    public DAOCadastroLei() {
        emf = Persistence.createEntityManagerFactory("siglemPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void inserir(Object o) {
        EntityManager em = null;

        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(o);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void alterar(Object o) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            o = em.merge(o);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = ((Lei) o).getId();
                if (pesquisar(id) == null) {
                    throw new NonexistentEntityException("Usuário com id = " + id + " não existe.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void excluir(Long id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Lei lei;
            try {
                lei = em.getReference(Lei.class, id);
                lei.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("Usuário com id = " + id + " não existe.", enfe);
            }
            em.remove(lei);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List pesquisar() {
        return pesquisar(true, -1, -1);
    }   

    public List pesquisar(Object o) {
        Lei l = (Lei) o;
        String sql = "select object(o) from Lei as o ";
        EntityManager em = getEntityManager();



        if (l.getEmenta() != null || l.getNumeroLei() != null || l.getProcesso() != null || l.getTexto() != null) {
            sql += " where ";
            if (l.getEmenta() != null) {
                sql += " ementa LIKE '%" + l.getEmenta()+"%'";
            }

            if (l.getNumeroLei() != null) {
                sql += " numeroLei = '" + l.getNumeroLei()+"'";
            }

            if (l.getTexto() != null) {
                sql += " texto LIKE '%" + l.getTexto() +"%'";
            }

            if (l.getProcesso() != null) {
                sql += " processo Like '%" + l.getProcesso()+"%'";
            }
        }


        try {
            Query q = em.createQuery(sql);
            //Query q = em.createQuery("select object(o) from Lei as o" + (!sql.isEmpty() ? " where " : "") + sql);
            return q.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new ArrayList();
    }

    public List pesquisar(int resultadosMaximo, int primeiroResultado) {
        return pesquisar(false, resultadosMaximo, primeiroResultado);
    }

    public List pesquisar(boolean tudo, int resultadosMaximo, int primeiroResultado) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Lei as o");
            if (!tudo) {
                q.setMaxResults(resultadosMaximo);
                q.setFirstResult(primeiroResultado);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Object pesquisar(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Lei.class, id);
        } finally {
            em.close();
        }
    }

    public int contar() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Lei as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

    public boolean revogar(String s){
        String sql = " select object(o) from Lei as o where numeroLei Like '%" +s+"%'";
        EntityManager em = getEntityManager();

        try {
            Query q = em.createQuery(sql);
            //Query q = em.createQuery("select object(o) from Lei as o" + (!sql.isEmpty() ? " where " : "") + sql);
            if(q.getResultList() != null){
                return true;
            }else{
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
       }

    public boolean numeroLeiUnica(String s){
        Lei l = new Lei();
        l.setNumeroLei(s);
        String sql = "select object(o) from Lei as o where numeroLei = '" + l.getNumeroLei() + "'";
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery(sql);
            //Query q = em.createQuery("select object(o) from Lei as o" + (!sql.isEmpty() ? " where " : "") + sql);
            ArrayList<Lei> res = (ArrayList<Lei>) q.getResultList();
            if(res.isEmpty()){
                return true;
            }else{
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    }


}
